using System;
using System.Linq;
using System.Web.Mvc;
using Ezio.Models;
using System.Collections.Generic;

namespace Ezio.Controllers
{
    public class MenusController : Controller
    {
        DataProvider Provider = new DataProvider();

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Agregar(Menus Menu)
        {
            Provider.AddToMenus(Menu);
            return RedirectToAction("Index", new { Success = Provider.TrySaveChanges() });
        }

        public ActionResult Index(bool? Success)
        {
            string Message = Success.HasValue ? Success.Value ? "" : "Ha ocurrido un error al procesar su peticion" : "";

            ViewData["Menus"] = Provider.Menus.ToList();
            ViewData["Insumos"] = Provider.Insumos.ToList();
            ViewData["TiposMenus"] = Provider.TiposMenus.ToList();
            ViewData["Grupos"] = Provider.Grupos.ToList();
            ViewData["Message"] = Message;
            return View("Index");
        }

        public ActionResult Editar(int Id)
        {
            ViewData["Menu"] = Provider.Menus.Single(t => t.IdMenu == Id);
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public bool Update(Menus Menu)
        {
            Menus myMenu = Provider.Menus.Single(t => t.IdMenu == Menu.IdMenu);
            myMenu.Copy(Menu);

            foreach (Preparaciones Preparacion in Menu.ListPreparaciones)
            {
                Preparaciones MyPreparacion = Provider.Preparaciones.SingleOrDefault(t => t.IdPreparacion == Preparacion.IdPreparacion);
                if (MyPreparacion != null)
                {
                    MyPreparacion.Copy(Preparacion);
                    foreach (Alimentos Alimento in Preparacion.Alimentos)
                    {
                        Alimentos MyAlimento = Provider.Alimentos.SingleOrDefault(t => t.IdAlimento == Alimento.IdAlimento);
                        if (MyAlimento != null)
                            MyAlimento.Copy(Alimento);
                        else
                            Provider.AddToAlimentos(Alimento);
                    }
                }
                else
                {
                    Preparacion.Menus = null;
                    Provider.AddToPreparaciones(Preparacion);
                    int ads = Provider.SaveChanges();
                }
            }

            return Provider.TrySaveChanges();
            
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public bool DeletePreparacion(int IdPreparacion)
        {
            Provider.Preparaciones.DeleteObject(Provider.Preparaciones.Single(t => t.IdPreparacion == IdPreparacion));

            return Provider.TrySaveChanges();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public bool DeleteAlimento(int IdAlimento)
        {
            Provider.Alimentos.DeleteObject(Provider.Alimentos.Single(t => t.IdAlimento == IdAlimento));
            return Provider.TrySaveChanges();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult CalValorNutricional(Menus Menu)
        {
            List<Alimentos> Alimentos = new List<Models.Alimentos>();
            Menu.Preparaciones.ToList().ForEach(t => Alimentos.AddRange(t.Alimentos.ToList()));
            Alimentos.ForEach(t => t.Insumos = Provider.Insumos.SingleOrDefault(r => r.IdInsumo == t.IdInsumo));
            Dictionary<string, double> Nutricional = new Dictionary<string, double>();

            Nutricional.Add("Calorias", Alimentos.Sum(t => t.Cantidad * t.Insumos.Calorias.Value));
            Nutricional.Add("Calcio", Alimentos.Sum(t => t.Cantidad * t.Insumos.Calcio.Value));
            Nutricional.Add("Carbohidratos", Alimentos.Sum(t => t.Cantidad * t.Insumos.Carbohidratos.Value));
            Nutricional.Add("Hierro", Alimentos.Sum(t => t.Cantidad * t.Insumos.Hierro.Value));
            Nutricional.Add("Lipidos", Alimentos.Sum(t => t.Cantidad * t.Insumos.Lipidos.Value));
            Nutricional.Add("Proteinas", Alimentos.Sum(t => t.Cantidad * t.Insumos.Proteinas.Value));

            return Json(Nutricional);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult CalCosto(Menus Menu)
        {
            List<Alimentos> Alimentos = new List<Models.Alimentos>();
            Menu.Preparaciones.ToList().ForEach(t => Alimentos.AddRange(t.Alimentos.ToList()));
            Alimentos.ForEach(t => t.Insumos = Provider.Insumos.SingleOrDefault(r => r.IdInsumo == t.IdInsumo));
            Dictionary<string, double> Costos = new Dictionary<string, double>();

            foreach (Alimentos Alimento in Alimentos)
            {
                List<ItemsOrdenesCompras> Items = Provider.ItemsOrdenesCompras.Where(t => t.IdInsumo == Alimento.IdInsumo).ToList();

                Costos[Alimento.Insumos.NombreInsumo] = Items.Count > 0 ?
                    Items.First(t => t.OrdenesCompras.Fecha == Items.Max(r => r.OrdenesCompras.Fecha)).Valor : -1;
            }

            return Json(Costos);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult CalCostoPromedio(Menus Menu)
        {
            List<Alimentos> Alimentos = new List<Models.Alimentos>();
            Menu.Preparaciones.ToList().ForEach(t => Alimentos.AddRange(t.Alimentos.ToList()));
            Alimentos.ForEach(t => t.Insumos = Provider.Insumos.SingleOrDefault(r => r.IdInsumo == t.IdInsumo));
            Dictionary<string, double> Costos = new Dictionary<string, double>();

            foreach (Alimentos Alimento in Alimentos)
            {
                List<ItemsOrdenesCompras> Items = Provider.ItemsOrdenesCompras.Where(t => t.IdInsumo == Alimento.IdInsumo).ToList();
                Costos[Alimento.Insumos.NombreInsumo] = Items.Count > 0 ? Items.Average(t => t.Valor) : -1;
            }

            return Json(Costos);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult GetById(int Id)
        {
            Menus menu = Provider.Menus.Single(t => t.IdMenu == Id);

            return Json(menu);
        }
    }
}
